package cn.dapeng.reference;

import cn.dapeng.util.SleepingUtil;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 虚引用： 给写JVM的人用的，在实际开发中基本没用
 * <p>
 * 管理堆外内存的
 *
 * 虚引用回收的时候，会把引用put到队列里，相当于发送一个通知
 */
public class PhantomReference_T01 {

    private static final List<Object> LIST = new LinkedList<>();
    private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();

    public static void main(String[] args) {
        PhantomReference<M> p = new PhantomReference<>(new M(), QUEUE);

        new Thread(() -> {
            while (true) {
                LIST.add(new byte[1024 * 1024]);
                SleepingUtil.sleep(1, TimeUnit.SECONDS);
                System.out.println(p.get());// 永远拿不到这个值
            }
        }).start();

        new Thread(() -> {
            while (true) {
                Reference<? extends M> poll = QUEUE.poll();
                if (poll != null) {
                    System.out.println("--- 虚引用对象被JVM回收了---");
                }
            }
        }).start();
    }


}
